/**
 * @program: leetcode062
 * @author: JCM
 * @create: 2023-02-20 10:56
 * @description:
 **/
public class Main {
    /**
     * 动态规划 dp[i][j] = dp[i-1][j] + dp[i][j-1]
     * @param m
     * @param n
     * @return
     */
    public int uniquePaths(int m, int n) {
        int[][] dp = new int[m][n];
        for(int i = 0; i < m; i++) dp[i][0] = 1;
        for(int j = 0; j < n; j++) dp[0][j] = 1;
        for(int i = 1; i < m; i++) {
            for(int j = 1; j < n; j++) {
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }
        }
        return dp[m-1][n-1];
    }

    // 递归，可以解决问题，但是时间超限
    public int uniquePaths1(int m, int n) {
        if (m == 1 && n == 1) return 0;
        if (m == 1 || n == 1) return 1;
        return uniquePaths1(m-1,n)+uniquePaths1(m,n-1);
    }
}
